import { defineStore } from 'pinia'
import { ElMessage } from 'element-plus'
import {
  login as userLogin,
  register as userRegister,
  logout as userLogout,
  getUserInfoById as fetchUserInfoById,
  updateUserProfile,
} from '../api/user'

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null,
    token: localStorage.getItem('token') || '',
    userId: localStorage.getItem('userId') || '',
  }),
  getters: {
    isLoggedIn: (state) => !!state.token,
    getUserInfo: (state) => state.userInfo,
  },
  actions: {
    // 初始化用户信息
    async initUserInfo(router = null) {
      try {
        console.log('开始初始化用户信息 - token:', this.token)
        console.log('开始初始化用户信息 - userId:', this.userId)
        if (this.token && this.userId) {
          try {
            console.log('尝试获取用户信息 - userId:', this.userId)
            const userInfo = await fetchUserInfoById(this.userId)
            console.log('获取用户信息响应:', userInfo)
            if (userInfo && userInfo.data) {
              this.userInfo = userInfo.data
              console.log('用户信息初始化成功 - userInfo:', this.userInfo)
            } else {
              console.error('初始化用户信息失败: 无效的用户数据')
              // 不立即登出，尝试保留token和userId
              this.userInfo = null
            }
          } catch (error) {
            console.error('初始化用户信息失败:', error)
            // 检查是否是401未授权错误
            if (error.response && error.response.status === 401) {
              console.error('token无效或已过期，清除本地存储')
              this.token = ''
              this.userId = ''
              localStorage.removeItem('token')
              localStorage.removeItem('userId')
              // 根据用户需求，token无效时不跳转登录页面，正常加载主页
            }
            this.userInfo = null
          }
        } else {
          console.log('没有找到有效的token或userId，无法初始化用户信息')
        }
      } catch (error) {
        console.error('初始化用户信息过程中发生错误:', error)
      }
    },
    // 登录
    // 登录
    async login(loginData) {
      try {
        const res = await userLogin(loginData)
        // 调整响应处理逻辑，确保正确获取token和用户信息
        if (res && res.data) {
          this.token = res.data.token || ''
          // 尝试从不同可能的字段获取用户信息
          this.userInfo = res.data.user || res.data || null

          // 确保userId正确设置
          if (this.userInfo && this.userInfo.id) {
            this.userId = this.userInfo.id.toString()
            localStorage.setItem('userId', this.userId)
          } else if (res.data.userId) {
            this.userId = res.data.userId.toString()
            localStorage.setItem('userId', this.userId)
          }

          localStorage.setItem('token', this.token)

          console.log('登录成功', res.data)
          // 使用自定义弹窗替代alert
          this.showNotification('登录成功', 'success')
          return true
        } else {
          console.error('登录失败: 无效的响应数据')
          this.showNotification('登录失败: 无效的响应数据', 'error')
          return false
        }
      } catch (error) {
        console.error('登录失败: ' + (error.message || '未知错误'))
        this.showNotification('登录失败: ' + (error.message || '未知错误'), 'error')
        return false
      }
    },

    // 显示通知弹窗
    showNotification(message, type = 'info') {
      // 使用Element Plus的ElMessage组件
      ElMessage({
        message,
        type,
        duration: 3000,
      })
    },
    // 注册
    async register(registerData) {
      try {
        const res = await userRegister(registerData)
        if (res.message) {
          console.log(res.message)
          this.showNotification(res.message, 'success')
          return true
        } else if (res.data) {
          console.log('注册成功')
          this.showNotification('注册成功', 'success')
          return true
        }
      } catch (error) {
        console.error('注册失败: ' + (error.message || '未知错误'))
        this.showNotification('注册失败: ' + (error.message || '未知错误'), 'error')
        return false
      }
    },
    // 登出
    async logout() {
      try {
        await userLogout()
      } catch (error) {
        console.error('登出失败:', error)
        this.showNotification('登出失败: ' + (error.message || '未知错误'), 'error')
      }
      // 无论如何都清除本地存储
      this.token = ''
      this.userInfo = null
      this.userId = ''
      localStorage.removeItem('token')
      localStorage.removeItem('userId')
      console.log('登出成功')
      this.showNotification('登出成功', 'success')
    },
    // 获取用户信息
    async getUserInfoById(id) {
      try {
        const res = await fetchUserInfoById(id)
        if (res && res.data) {
          return res.data
        }
        console.error('获取用户信息失败: 无效的响应数据')
        return null
      } catch (error) {
        console.error('获取用户信息失败:', error)
        this.showNotification('获取用户信息失败', 'error')
        return null
      }
    },
    // 更新用户信息
    async updateUserInfo(userInfo) {
      try {
        const res = await updateUserProfile(userInfo)
        if (res.message) {
          console.log(res.message)
          this.showNotification(res.message, 'success')
          // 更新本地用户信息
          if (this.userInfo && this.userInfo.id === userInfo.id) {
            this.userInfo = { ...this.userInfo, ...userInfo }
          }
          return true
        } else if (res.data) {
          console.log('更新用户信息成功')
          this.showNotification('更新用户信息成功', 'success')
          // 更新本地用户信息
          if (this.userInfo && this.userInfo.id === userInfo.id) {
            this.userInfo = { ...this.userInfo, ...userInfo }
          }
          return true
        }
      } catch (error) {
        console.error('更新用户信息失败:', error)
        this.showNotification('更新用户信息失败', 'error')
        return false
      }
    },
  },
})
